import java.util.Arrays;
import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        // Field 信息
        // 对任意的一个Object实例，只要我们获取了它的Class，就可以获取它的一切信息。
        // getDeclaredField(name)：根据字段名获取当前类的某个field（
        // getFields()：获取所有public的field（包括父类）
        // getDeclaredFields()：获取当前类的所有field

        Class<Student> stdClass = Student.class;
        System.out.println(stdClass.getField("score"));
        System.out.println(stdClass.getField("name"));
        System.out.println(stdClass.getDeclaredField("grade"));
        System.out.println("所有public字段：" + Arrays.toString(stdClass.getFields()));

        // Field 获取的值
        Person p = new Person("Xiao Ming");
        Class<?> c = p.getClass();
        Field f = c.getDeclaredField("name");
        Object value = f.get(p);
        System.out.println(value); // "Xiao Ming"

        // 修改Field的值
        // Field.setAccessible(true)的意思是，别管这个字段是不是public，一律允许访问
        f.setAccessible(true); 
        f.set(p, "Xiao Hong");
        System.out.println(p.getName()); // "Xiao Hong"
    }

}

class Student extends Person {
    public int score;
    private int grade;

    Student(String name, int score, int grade) {
        super(name);
        this.score = score;
        this.grade = grade;
    }

}

class Person {
    public String name;

    Person(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}